package br.com.mauricioreis;

import java.util.List;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import br.com.mauricioreis.db.Alimento;
import br.com.mauricioreis.db.Medida;
import br.com.mauricioreis.db.MedidaAlimento;

public class MedidaAssociarAct extends Activity {
    public ListView viewMedida;
    public Button buttonFiltro;
    private Alimento alimento;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.medida_associar);
        // obtem dados vindos da outra tela
        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            return;
        }
        // obtem o id da alimento
        Integer idAlimento = extras.getInt("idAlimento", 0);
        // obtem a alimento através do seu ID
        this.alimento = new Alimento();
        this.alimento.setId(idAlimento);
        this.alimento = Alimento.consultar(this, alimento);

        montaBotaoFiltrar();
        montaViewMedida();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        montaViewMedida();

    }

    /**
     * Realiza o filtro de medidas e, conforme o estado atual do botão, mostra as medidas associadas ou não associadas ao alimento
     */
    private void montaBotaoFiltrar() {
        buttonFiltro = (Button) findViewById(R.id.medidaFiltrar);
        buttonFiltro.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // se o botão filtro esta mostrando as medidas associadas pasará a mostrar as medidas não associadas
                if (estaMostrandoMedidasAssociadas()) {
                    buttonFiltro.setText(R.string.medida_associada);
                } else {
                    buttonFiltro.setText(R.string.medida_nao_associada);
                }
                montaViewMedida();
            }
        });

    }

    private void montaViewMedida() {
        List<Medida> medidas = Medida.listarMedidasAssociadas(this, alimento, estaMostrandoMedidasAssociadas());
        ArrayAdapter<Medida> adapterMedida = new ArrayAdapter<Medida>(this, android.R.layout.simple_list_item_1, medidas);
        viewMedida = (ListView) findViewById(R.id.ListView01);
        viewMedida.setAdapter(adapterMedida);
        montaClickAssociar();
    }

    private void montaClickAssociar() {
        viewMedida.setOnItemClickListener(new OnItemClickListener() {
            @Override
            @SuppressWarnings(value = "rawtypes")
            public void onItemClick(AdapterView arg0, View arg1, int posicaoItem, long arg3) {
                // pega o objeto medida da posição selecionada
                final Medida medidaSelecionada = (Medida) viewMedida.getItemAtPosition(posicaoItem);
                AlertDialog.Builder alert = null;
                String tituloJanela = null;
                String mensagemJanela = null;
                // Se esta na tela de medidas não associadas
                if (!estaMostrandoMedidasAssociadas()) {
                    tituloJanela = "Associar medida";
                    mensagemJanela = "Informe quantos gramas de " + alimento.getNome() + " equivalem a um(a) "
                            + medidaSelecionada.getNome();
                    alert = criaJanelaAlert(MedidaAssociarAct.this, tituloJanela, mensagemJanela);
                    // Set an EditText view to get user input
                    final EditText input = new EditText(MedidaAssociarAct.this);
                    alert.setView(input);

                    alert.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int whichButton) {
                            String medidaGrama = input.getText().toString();
                            MedidaAlimento medidaAlimento = new MedidaAlimento();
                            medidaAlimento.setIdAlimento(alimento.getId());
                            medidaAlimento.setIdMedida(medidaSelecionada.getId());
                            medidaAlimento.setMedidaGrama(Float.valueOf(medidaGrama));
                            MedidaAlimento.incluir(MedidaAssociarAct.this, medidaAlimento);
                            montaViewMedida();
                        }
                    });

                    alert.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int whichButton) {
                            // Cancelado.
                        }
                    });

                } else {
                    tituloJanela = "Desassociar medida";
                    mensagemJanela = "Realmente deseja desassociar " + medidaSelecionada.getNome() + " de " + alimento.getNome() + "?";
                    alert = criaJanelaAlert(MedidaAssociarAct.this, tituloJanela, mensagemJanela);
                    alert.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int whichButton) {

                            MedidaAlimento medidaAlimento = new MedidaAlimento();
                            medidaAlimento.setIdAlimento(alimento.getId());
                            medidaAlimento.setIdMedida(medidaSelecionada.getId());
                            medidaAlimento = MedidaAlimento.consultarChaveUnica(MedidaAssociarAct.this, medidaAlimento);
                            MedidaAlimento.excluir(MedidaAssociarAct.this, medidaAlimento);
                            montaViewMedida();
                        }
                    });

                    alert.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int whichButton) {
                            // Cancelado.
                        }
                    });

                }
                alert.show();
            }
        });
    }

    /**
     * Cria uma janela modal
     * 
     * @param activity
     * @param titulo
     * @param mensagem
     * @param temEdit
     * @return
     */
    private static AlertDialog.Builder criaJanelaAlert(Activity activity, String titulo, String mensagem) {
        AlertDialog.Builder alert = new AlertDialog.Builder(activity);

        alert.setTitle(titulo);
        alert.setMessage(mensagem);
        return alert;

    }

    /**
     * Informa se a tela esta listando as medidas associadas ou não
     */
    private Boolean estaMostrandoMedidasAssociadas() {
        // se o botão filtro esta mostrando as medidas associadas pasará a mostrar as medidas não associadas
        if (buttonFiltro.getText().toString().equals(getString(R.string.medida_associada))) {
            return false;
        }
        return true;
    }
}
